# this py for 数据字段
# sqlite 数据库  用户模型

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models
from django.utils import timezone
from django.core.exceptions import ValidationError


class SqliteUserManager(BaseUserManager):
    def create_user(self, username, password=None, **extra_fields):
        """
        创建普通用户
        """
        # 检查必填字段
        if not username:
            raise ValidationError('用户名是必填项')

        # 创建用户
        user = self.model(
            username=username,
            **extra_fields
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None, **extra_fields):
        """
        创建超级用户
        """
        # 设置默认值
        extra_fields.setdefault('is_manager', True)
        extra_fields.setdefault('is_superuser', True)

        # 检查超级用户权限
        if extra_fields.get('is_manager') is not True:
            raise ValidationError('超级用户必须设置 is_manager=True')
        if extra_fields.get('is_superuser') is not True:
            raise ValidationError('超级用户必须设置 is_superuser=True')

        # 创建超级用户
        return self.create_user(username, password, **extra_fields)


# 用户模型
class SqliteUserModel(AbstractBaseUser, PermissionsMixin):
    # 用户ID（自增主键）
    user_id = models.AutoField(primary_key=True)

    # 用户名（唯一）
    username = models.CharField(max_length=100, unique=True)

    # 密码
    password = models.CharField(max_length=128)

    # 姓名
    name = models.CharField(max_length=100)

    # 邮箱
    email = models.EmailField(
        max_length=100,
        unique=True,
        null=True,
        blank=True,
        verbose_name='邮箱'
    )

    # 电话
    phone = models.CharField(
        max_length=20,
        blank=True,
        null=True,
        verbose_name='电话'
    )

    # 地址
    address = models.CharField(
        max_length=200,
        blank=True,
        null=True,
        verbose_name='地址'
    )

    # 是否是管理员
    is_manager = models.BooleanField(default=False)  # 必须字段


    # 用户管理器
    objects = SqliteUserManager()

    # 指定登录字段
    USERNAME_FIELD = 'username'

    # 指定必填字段（用于创建超级用户）
    REQUIRED_FIELDS = ['email']

    class Meta:
        verbose_name = '用户'  # 单数形式
        verbose_name_plural = '用户'  # 复数形式

    def __str__(self):
        return self.username